home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 317_01 / builddec.c < prev    next >
C/C++ Source or Header  |  1990-06-16  |  29KB  |  838 lines

  1. /*    $Id: builddec.c 1.2 90/06/09 18:25:13 marking Exp $
  2.  *
  3.  NAME
  4.  *    builddec.c -- build decoding tables for group 3 and group 4 images
  5.  *
  6.  TYPE
  7.  *    C source for main program and subroutines
  8.  *
  9.  SYNOPSIS
  10.  *    builddec
  11.  *
  12.  DESCRIPTION
  13.  *    This program builds tables for decoding group 3 and group 4 encoded
  14.  *    images. The tables are built as the arrays null_mode [] [],
  15.  *    null_mode_next_state [] [], horiz_mode [] [], and
  16.  *    horiz_mode_next_state [] []. The output is C source code which must
  17.  *    be compiled and linked into a decoding program.
  18.  *
  19.  RETURNS
  20.  *    zero if no errors detected, nonzero otherwise
  21.  *
  22.  LEGAL
  23.  *    Copyright 1989, 1990 Michael P. Marking, Post Office Box 8039,
  24.  *    Scottsdale, Arizona 85252-8039. All rights reserved.
  25.  *
  26.  *    License is granted by the copyright holder to distribute and use this
  27.  *    code without payment of royalties or the necessity of notification as
  28.  *    long as this notice (all the text under "LEGAL") is included.
  29.  *
  30.  *    Reference: $Id: builddec.c 1.2 90/06/09 18:25:13 marking Exp $
  31.  *
  32.  *    This program is offered without any warranty of any kind. It includes
  33.  *    no warranty of merchantability or fitness for any purpose. Testing and
  34.  *    suitability for any use are the sole responsibility of the user.
  35.  * 
  36.  HISTORY
  37.  *    $Log:    builddec.c $
  38.  * Revision 1.2  90/06/09  18:25:13  marking
  39.  * clean up comments for release
  40.  * 
  41.  * Revision 1.1  89/06/30  17:00:00  marking
  42.  * Initial revision
  43.  * 
  44.  * 
  45.  NOTES
  46.  *    1.    Since it is expected that this program will be run
  47.  *        infrequently, there is no attempt at optimization.
  48.  *    2.    The tables horiz_mode [] [] and horiz_mode_next_state [] []
  49.  *        are used in both group 3 and group 4 decoding. The tables
  50.  *        null_mode [] [] and null_mode_next_state [] [] are used only
  51.  *        in decoding group 4.
  52.  *    3.    On an XT, this can take around 15 minutes. The progress
  53.  *        messages it displays let you know it's still alive, but
  54.  *        otherwise can be ignored.
  55.  *    4.    Most of the documentation for the tables themselves is in
  56.  *        the decode routines g3tdecod.c and g4tdecod.c.
  57.  *
  58.  FILES
  59.  *    Creates the file "tables.c", which is to be compiled and linked into
  60.  *    the table-driven decoding routine.
  61.  *
  62.  PORTABILITY
  63.  *    Tested under Microsoft C 5.1. Should be fairly portable.
  64.  *
  65.  SEE ALSO
  66.  *    g3tdecod.c -- decode group 3 image using tables
  67.  *    g4tdecod.c -- decode group 4 image using tables
  68.  *    "Decoding Group 3 Images", C Users Journal, June 1990
  69.  *
  70.  INFORMATION
  71.  *    Although there is no support offered with this program, the author will
  72.  *    endeavor to correct errors. Updates will also be made available from
  73.  *    time to time.
  74.  *
  75.  *    Contact: Michael P. Marking, Post Office Box 8039, Scottsdale, Arizona
  76.  *    85252-8039 USA. Replies are not guaranteed to be swift. Beginning
  77.  *    July 1990, e-mail may be sent to uunet!ipel!marking.
  78.  *
  79.  *    Also beginning in July 1990, this code will be archived at the
  80.  *    ipel!phoenix BBS in file g3g4.zoo. The 24-hour telephone number
  81.  *    for 300/1200/2400 is (602)274-0462. When logging in, specify user
  82.  *    "public", system "bbs", and password "public".
  83.  *
  84.  *    This code is also available from the C Users Group in volume 317.
  85.  *
  86.  */
  87.  
  88. /*
  89.  *    standard headers
  90.  */
  91.  
  92. #include    <stddef.h>        /* common types and macros */
  93. #include    <stdio.h>        /* streams and files */
  94. #include    <stdlib.h>        /* assorted functions, macros, types */
  95.  
  96. /*
  97.  *    application
  98.  */
  99.  
  100. #include "g3g4.h"            /* some #defines */
  101.  
  102. #define INVALID_CODE -1
  103. #define INCOMPLETE_CODE -2
  104. #define EOL_CODE -3
  105.  
  106. unsigned long append_0 (unsigned long);
  107. unsigned long append_1 (unsigned long);
  108. short black_run_length (unsigned long);
  109. short search_run_length_table (unsigned long, long *);
  110. short white_run_length (unsigned long);
  111.  
  112. unsigned long append_0 (unsigned long prefix)
  113. {
  114.   return (prefix + 0x10000);
  115. }
  116.  
  117. unsigned long append_1 (unsigned long prefix)
  118. {
  119.   unsigned short prefix_length;
  120.   static unsigned short prefix_mask [16] = {0x8000, 0x4000, 0x2000, 0x1000,
  121.     0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008,
  122.     0x0004, 0x0002, 0x0001};
  123.   prefix_length = 0xFF & (unsigned short) (prefix >> 16);
  124.   return (prefix + 0x10000 + prefix_mask [prefix_length]);
  125. }
  126.  
  127. short search_run_length_table (unsigned long prefix, long *p_table)
  128. {
  129.   short table_offset = 0;
  130.   long prefix_length, prefix_value;
  131.   prefix_length = 0xFF & (prefix >> 16);
  132.   prefix_value = 0xFFFF & prefix;
  133.   while (p_table [table_offset])
  134.   {
  135.     if (p_table [table_offset] == prefix_length
  136.       && p_table [table_offset + 1] == prefix_value)
  137.     return ((short) p_table [table_offset + 2]);
  138.     table_offset += 3; /* move on to next entry */
  139.   }
  140.   return (INCOMPLETE_CODE); /* no entry found in table */
  141. }
  142.  
  143. short white_run_length (unsigned long prefix)
  144. {
  145.   static long code_table [] =
  146.   {
  147.     8, 0x3500, 0, /* 0011 0101 */
  148.     6, 0x1C00, 1, /* 0001 11 */
  149.     4, 0x7000, 2, /* 0111 */
  150.     4, 0x8000, 3, /* 1000 */
  151.     4, 0xB000, 4, /* 1011 */
  152.     4, 0xC000, 5, /* 1100 */
  153.     4, 0xE000, 6, /* 1110 */
  154.     4, 0xF000, 7, /* 1111 */
  155.     5, 0x9800, 8, /* 1001 1 */
  156.     5, 0xA000, 9, /* 1010 0 */
  157.     5, 0x3800, 10, /* 0011 1 */
  158.     5, 0x4000, 11, /* 0100 0 */
  159.     6, 0x2000, 12, /* 0010 00 */
  160.     6, 0x0C00, 13, /* 0000 11 */
  161.     6, 0xD000, 14, /* 1101 00 */
  162.     6, 0xD400, 15, /* 1101 01 */
  163.     6, 0xA800, 16, /* 1010 10 */
  164.     6, 0xAC00, 17, /* 1010 11 */
  165.     7, 0x4E00, 18, /* 0100 111 */
  166.     7, 0x1800, 19, /* 0001 100 */
  167.     7, 0x1000, 20, /* 0001 000 */
  168.     7, 0x2E00, 21, /* 0010 111 */
  169.     7, 0x0600, 22, /* 0000 011 */
  170.     7, 0x0800, 23, /* 0000 100 */
  171.     7, 0x5000, 24, /* 0101 000 */
  172.     7, 0x5600, 25, /* 0101 011 */
  173.     7, 0x2600, 26, /* 0010 011 */
  174.     7, 0x4800, 27, /* 0100 100 */
  175.     7, 0x3000, 28, /* 0011 000 */
  176.     8, 0x0200, 29, /* 0000 0010 */
  177.     8, 0x0300, 30, /* 0000 0011 */
  178.     8, 0x1A00, 31, /* 0001 1010 */
  179.     8, 0x1B00, 32, /* 0001 1011 */
  180.     8, 0x1200, 33, /* 0001 0010 */
  181.     8, 0x1300, 34, /* 0001 0011 */
  182.     8, 0x1400, 35, /* 0001 0100 */
  183.     8, 0x1500, 36, /* 0001 0101 */
  184.     8, 0x1600, 37, /* 0001 0110 */
  185.     8, 0x1700, 38, /* 0001 0111 */
  186.     8, 0x2800, 39, /* 0010 1000 */
  187.     8, 0x2900, 40, /* 0010 1001 */
  188.     8, 0x2A00, 41, /* 0010 1010 */
  189.     8, 0x2B00, 42, /* 0010 1011 */
  190.     8, 0x2C00, 43, /* 0010 1100 */
  191.     8, 0x2D00, 44, /* 0010 1101 */
  192.     8, 0x0400, 45, /* 0000 0100 */
  193.     8, 0x0500, 46, /* 0000 0101 */
  194.     8, 0x0A00, 47, /* 0000 1010 */
  195.     8, 0x0B00, 48, /* 0000 1011 */
  196.     8, 0x5200, 49, /* 0101 0010 */
  197.     8, 0x5300, 50, /* 0101 0011 */
  198.     8, 0x5400, 51, /* 0101 0100 */
  199.     8, 0x5500, 52, /* 0101 0101 */
  200.     8, 0x2400, 53, /* 0010 0100 */
  201.     8, 0x2500, 54, /* 0010 0101 */
  202.     8, 0x5800, 55, /* 0101 1000 */
  203.     8, 0x5900, 56, /* 0101 1001 */
  204.     8, 0x5A00, 57, /* 0101 1010 */
  205.     8, 0x5B00, 58, /* 0101 1011 */
  206.     8, 0x4A00, 59, /* 0100 1010 */
  207.     8, 0x4B00, 60, /* 0100 1011 */
  208.     8, 0x3200, 61, /* 0011 0010 */
  209.     8, 0x3300, 62, /* 0011 0011 */
  210.     8, 0x3400, 63, /* 0011 0100 */
  211.     5, 0xD800, 64, /* 1101 1 */
  212.     5, 0x9000, 128, /* 1001 0 */
  213.     6, 0x5C00, 192, /* 0101 11 */
  214.     7, 0x6E00, 256, /* 0110 111 */
  215.     8, 0x3600, 320, /* 0011 0110 */
  216.     8, 0x3700, 384, /* 0011 0111 */
  217.     8, 0x6400, 448, /* 0110 0100 */
  218.     8, 0x6500, 512, /* 0110 0101 */
  219.     8, 0x6800, 576, /* 0110 1000 */
  220.     8, 0x6700, 640, /* 0110 0111 */
  221.     9, 0x6600, 704, /* 0110 0110 0 */
  222.     9, 0x6680, 768, /* 0110 0110 1 */
  223.     9, 0x6900, 832, /* 0110 1001 0 */
  224.     9, 0x6980, 896, /* 0110 1001 1 */
  225.     9, 0x6A00, 960, /* 0110 1010 0 */
  226.     9, 0x6A80, 1024, /* 0110 1010 1 */
  227.     9, 0x6B00, 1088, /* 0110 1011 0 */
  228.     9, 0x6B80, 1152, /* 0110 1011 1 */
  229.     9, 0x6C00, 1216, /* 0110 1100 0 */
  230.     9, 0x6C80, 1280, /* 0110 1100 1 */
  231.     9, 0x6D00, 1344, /* 0110 1101 0 */
  232.     9, 0x6D80, 1408, /* 0110 1101 1 */
  233.     9, 0x4C00, 1472, /* 0100 1100 0 */
  234.     9, 0x4C80, 1536, /* 0100 1100 1 */
  235.     9, 0x4D00, 1600, /* 0100 1101 0 */
  236.     6, 0x6000, 1664, /* 0110 00 */
  237.     9, 0x4D80, 1728, /* 0100 1101 1 */
  238.     11, 0x0100, 1792, /* 0000 0001 000 */
  239.     11, 0x0180, 1856, /* 0000 0001 100 */
  240.     11, 0x